ES6 (ECMAScript 2015) - 新特性完整學習指南
📚 練習目標
ES6 (ECMAScript 2015) 是 JavaScript 的一次重大革新。本課程將系統地介紹 ES6 的核心特性,包括新的變量宣告方式、箭頭函數、模板字串、解構賦值、展開運算子、類別、非同步處理等概念。通過這些例子,學生將掌握現代 JavaScript 開發的必要知識。
P1 - let 和 const 變數宣告
為什麼需要 let 和 const?
ES5 只有 var,存在作用域混淆問題。ES6 引入 let 和 const,提供了更清晰的變量管理方式。
var- 函數作用域,易造成全域污染let- 區塊作用域,可重新賦值const- 區塊作用域,不可重新賦值(最安全)- 現代開發推薦優先使用
const,需要更改時用let
查看 var、let、const 的具體差異及應用場景
深入理解區塊作用域與函數作用域的區別
理解 var 和 let 在提升(hoisting)方面的差異
P2 - 箭頭函數 (Arrow Functions)
什麼是箭頭函數?
箭頭函數是一種簡潔的函數語法,同時改變了 this 的綁定方式。箭頭函數會繼承外層的 this,而不是動態綁定。
- 箭頭函數使用
=>語法 - 沒有參數時:
() => {} - 單一參數時:
x => {} - 多個參數時:
(x, y) => {} - 箭頭函數沒有自己的
this,繼承外層的this - 不能用作建構函數(constructor)
理解全域環境中的 this 及其行為
P3 - 模板字串 (Template Literals)
模板字串簡化字符串操作
使用反引號(backtick)取代引號,可以直接插入變量和表達式,支援多行字符串。
- 使用反引號(
`)包含字符串 - 用
${}插入變量或表達式 - 支援多行字符串,無需
+拼接 - 可在
${}中進行任何 JavaScript 表達式運算
P4 - 解構賦值 (Destructuring Assignment)
快速從陣列或物件中提取值
解構賦值允許我們用更簡潔的方式從陣列或物件中提取值並賦給變量。
- 陣列解構:按順序提取值
- 物件解構:按屬性名稱提取值
- 可用逗號跳過不需要的值
- 可設定預設值以防值不存在
- 可重新命名以避免名稱衝突
查看常數與解構的結合使用
理解如何使用解構操作陣列
P5 - 展開運算子 (...) 與其餘參數 (Rest Parameters)
... 運算子的雙重作用
展開運算子(Spread)用於展開陣列或物件,其餘參數(Rest)用於收集多個參數。雖然語法相同,但用途不同。
- 展開:在函數呼叫或陣列/物件字面量中展開元素
- 其餘參數:在函數參數列表中收集剩餘的參數
- 展開陣列可用於複製、合併陣列
- 其餘參數必須是參數列表中的最後一個
- 可用於函數參數、陣列、物件字面量
理解參數與引數的區別,及其餘參數的實用性
深入瞭解參數傳遞時 undefined 和 null 的差異
P6 - 變數提升 (Hoisting)
理解 JavaScript 的執行過程
Hoisting 是 JavaScript 引擎在執行代碼前的預處理階段。var 和函數聲明會被提升,但 let 和 const 不會真正提升,而是進入「暫時死亡區」(Temporal Dead Zone)。
var聲明被提升,但初始化值不提升(結果為 undefined)let和const進入暫時死亡區,不能在宣告前使用- 函數聲明完全被提升
- 函數表達式不被提升(只有變量提升)
- 這是為什麼避免使用
var的重要原因
親眼看到 var 和 let 在提升行為上的區別
更多 hoisting 行為的演示
深入理解暫時死亡區的概念
看 hoisting 如何導致難以發現的 bug
P7 - setTimeout 與非同步執行
JavaScript 的單線程與非同步
setTimeout 是一個非同步函數,它延遲執行代碼。理解 setTimeout 對於理解事件迴圈(Event Loop)和回調地獄(Callback Hell)至關重要。
setTimeout是非同步的,不會阻塞代碼執行setInterval重複執行,可用clearInterval停止- 第二個參數是延遲毫秒數
- 回調函數在延遲時間後加入事件佇列,而非立即執行
- 理解這個概念對學習 Event Loop 很重要
了解 setTimeout 的基本用法
理解 setTimeout 的非同步本質
P8 - 條件式中的 let 與作用域
區塊作用域在條件語句中的應用
使用 let 在 if 和迴圈中宣告變量,會限制其作用域在該區塊內,避免全域污染。
let在區塊内({})宣告時,作用域限制在該區塊- 在迴圈中使用
let,每次迭代都會建立新的作用域 - 這解決了
var在迴圈中常見的閉包問題 - 使用
let可以避免許多難以追蹤的 bug
看看 let 在條件語句中如何限制作用域
P9 - 常數 (const) 與最佳實踐
優先使用 const,其次使用 let
const 宣告的變量不能被重新賦值,這使代碼更加可預測和安全。當需要改變值時,才使用 let。
- 預設使用
const:不會被重新賦值的變量應該用 const - 需要改變時用
let:只有當變量需要重新賦值時才用 let - 避免使用
var:在現代代碼中不應該使用 var const保護的是引用,不是值本身(物件屬性仍可改變)- 這個習慣可以減少 bug,因為 const 強制你在宣告時初始化,並防止意外重新賦值
理解 const 的基本用法
看 const 如何用於進階場景
進階參數處理技巧
實際應用示例
P10 - 其他重要的 ES6 主題
ES6 還有更多特性值得學習
除了上述特性外,ES6 還包括:
- 類別(Classes) - 更接近傳統 OOP 的語法
- Promise - 處理非同步操作的優雅方式
- for...of 迴圈 - 遍歷可迭代對象
- 模組(Modules) - import/export 實現模組化
- Map 和 Set - 新的資料結構
- Symbol - 新的原始資料型別
推薦學習路線
- 掌握
let和const- 這是基礎 - 習慣箭頭函數和模板字串 - 提高代碼可讀性
- 深入理解解構和展開 - 減少樣板代碼
- 理解 hoisting 和作用域 - 避免常見 bug
- 掌握非同步概念(setTimeout、Promise、async/await)
- 學習類別和模組化開發
ES5 vs ES6 比較表
| 特性 | ES5 | ES6+ | 推薦用法 |
|---|---|---|---|
| 變量宣告 | var x = 1; |
let x = 1; / const x = 1; |
優先 const,需要改變用 let |
| 函數 | function add(a, b) { return a + b; } |
const add = (a, b) => a + b; |
箭頭函數更簡潔,但注意 this |
| 字符串 | "Hello " + name |
`Hello ${name}` |
模板字串更清晰易讀 |
| 提取值 | const a = arr[0]; const b = arr[1]; |
const [a, b] = arr; |
解構更簡潔高效 |
| 作用域 | 函數作用域(容易混淆) | 區塊作用域(清晰明確) | 使用 let/const 避免問題 |
| 非同步 | 嵌套回調 | Promise、async/await | 避免回調地獄,使用 Promise 或 async/await |
📋 ES6 核心概念總結
七個必須掌握的 ES6 概念
- let 和 const - 現代變量宣告的基石
- 箭頭函數 - 簡潔的函數語法和 this 綁定
- 模板字串 - 更優雅的字符串操作
- 解構賦值 - 快速提取和賦值
- 展開運算子與其餘參數 - 靈活的參數處理
- 作用域與 Hoisting - 理解代碼執行順序
- 非同步概念 - setTimeout、Promise、async/await
- 🔗 按順序進行 - 從簡單概念開始,逐步深入
- 💻 動手實踐 - 在瀏覽器開發者工具中運行示例代碼
- 🎯 理解概念而非背誦 - 理解為什麼要這樣做,而非只知道怎麼做
- 📚 參考官方文檔 - MDN 和 ECMAScript 標準是最可靠的資源
- 🧪 進行小實驗 - 修改示例代碼,看看會發生什麼
Final 示範頁
下面集中列出適合公開查看的成果頁與示範頁。